# 数组的函数

import numpy as np

# 注意：
# 在 线性代数 中，向量和一维矩阵（一行或一列的矩阵）在数学意义上可以看作是等价的。
# 但在 NumPy 中，它们是不同的数据类型
# 外积 是两个向量生成一个矩阵的操作，矩阵的每个元素是两个向量对应元素的乘积。
# 内积 是两个向量生成一个标量的操作，标量是两个向量对应元素乘积的和。

# 6.1 线性代数中的矩阵乘积

# # （1）向量与向量的乘积

# arr1 = np.array([1, 2, 3])
# print("arr1\n", arr1)
# arr2 = np.array([4, 5, 6])
# print("arr2\n", arr2)
# # 1. 内积（点积，Dot Product）
# # 内积是两个向量对应元素相乘后相加的结果，结果是一个标量
# # A 1行n列的矩阵  B n行1列的矩阵  两矩阵进行矩阵乘法得到标量
# # np.inner(a, b)（仅对向量等价于点积）
# # np.dot(a, b)
# arr3 = np.dot(arr1, arr2)
# print("点积 arr3\n",type(arr3), arr3)
# arr4 = np.inner(arr1, arr2)
# print("点积 arr4\n",type(arr4), arr4)
# # 2. 外积（叉积，Cross Product）
# # 外积是仅针对三维向量的运算，结果是一个与输入向量垂直的新向量
# # np.cross(a, b)
# arr5 = np.cross(arr1, arr2)
# print("叉积 arr5\n",type(arr5), "\n", arr5)
# arr6 = np.cross(arr2, arr1)
# print("叉积 arr6\n",type(arr6), "\n", arr6)

# # 3. 外积（张量积，Outer Product）
# # 注意：术语“外积”有时也指张量积（结果是一个矩阵）
# # A m行 1列   B 1行 n列  两矩阵进行矩阵乘法得到m行n列的矩阵
# # 通过 np.outer(a, b) 实现。
# arr7 = np.outer(arr1, arr2)
# print("张量积 arr7\n",type(arr7), "\n", arr7)


# （2）矩阵与矩阵的乘积
# 线性代数中的矩阵乘法使用dot实现
# 向量和矩阵也可以使用dot实现，同线性代数中一样，不再演示
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[4, 3, 2, 1], [7, 6, 5, 4], [6, 7, 8, 9]])
print("arr1\n", arr1)
print("arr2\n", arr2)
arr3 = np.dot(arr1, arr2)
print("arr3\n", arr3)


# # 6.2 数学函数
# # 略
# # 6.3 聚合函数
# # 最大值函数 np.max( )与最小值函数 np.min( )
# arr = np.random.randint(1, 26, (5, 5))
# print("arr\n", arr)
# print("按维度[0]求最大值", np.max(arr, axis=0))
# print("按维度[1]求最大值", np.max(arr, axis=1))
# print( '整体求最大值：', np.max(arr))
# # 求和函数 np.sum( )与求积函数 np.prod( )
# print("按维度[0]求和：", np.sum(arr, axis=0))
# print("按维度[1]求和：", np.sum(arr, axis=1))
# print("整体求和：", np.sum(arr))
# # 均值函数 np.mean( )与标准差函数 np.std( )
# print("按维度[0]求平均：", np.mean(arr, axis=0))
# print("按维度[1]求平均：", np.mean(arr, axis=1))
# print("整体求平均", np.mean(arr))
# print("按维度[0]求标准差", np.std(arr, axis=0))
# print("按维度[1]求标准差", np.std(arr, axis=1))
# print("整体求标准差", np.std(arr))

# # ⚫ 当 axis=0 时，最终结果与每一行的元素个数一致；
# # 当 axis=1 时，最终结果与每一列的元素个数一致。
# # ⚫ 考虑到大型数组难免有缺失值，以上聚合函数碰到缺失值时会报错，因此
# # 出现了聚合函数的安全版本，即计算时忽略缺失值：np.nansum( )、
# # np.nanprod( ) 、np.nanmean( )、np.nanstd( )、np.nanmax( )、np.nanmin( )。